package com.taotao.common.pojo;  
  
import java.io.Serializable;  
import java.util.List;  
  
import com.fasterxml.jackson.databind.JsonNode;  
import com.fasterxml.jackson.databind.ObjectMapper;  
  
/**  
 * 长理网上商城商城自定义响应结构  
 */  
public class TaotaoResult implements Serializable{  
  
    // 定义jackson对象  
    private static final ObjectMapper MAPPER = new ObjectMapper();  
  
    // 响应业务状态  
    private Integer status;  
  
    // 响应消息  
    private String msg;  
  
    // 响应中的数据  
    private Object data;  
  
    public static TaotaoResult build(Integer status, String msg, Object data) {  
        return new TaotaoResult(status, msg, data);  
    }  
  
    public static TaotaoResult ok(Object data) {  
        return new TaotaoResult(data);  
    }  
  
    public static TaotaoResult ok() {  
        return new TaotaoResult(null);  
    }  
  
    public TaotaoResult() {  
  
    }  
  
    public static TaotaoResult build(Integer status, String msg) {  
        return new TaotaoResult(status, msg, null);  
    }  
  
    public TaotaoResult(Integer status, String msg, Object data) {  
        this.status = status;  
        this.msg = msg;  
        this.data = data;  
    }  
  
    public TaotaoResult(Object data) {  
        this.status = 200;  
        this.msg = "OK";  
        this.data = data;  
    }  
  
//    public Boolean isOK() {  
//        return this.status == 200;  
//    }  
  
    public Integer getStatus() {  
        return status;  
    }  
  
    public void setStatus(Integer status) {  
        this.status = status;  
    }  
  
    public String getMsg() {  
        return msg;  
    }  
  
    public void setMsg(String msg) {  
        this.msg = msg;  
    }  
  
    public Object getData() {  
        return data;  
    }  
  
    public void setData(Object data) {  
        this.data = data;  
    }  
  
    /**  
     * 将json结果集转化为TaotaoResult对象  
     *   
     * @param jsonData json数据  
     * @param clazz TaotaoResult中的object类型  
     * @return  
     */  
    public static TaotaoResult formatToPojo(String jsonData, Class<?> clazz) {  
        try {  
            if (clazz == null) {  
                return MAPPER.readValue(jsonData, TaotaoResult.class);  
            }  
            JsonNode jsonNode = MAPPER.readTree(jsonData);  
            JsonNode data = jsonNode.get("data");  
            Object obj = null;  
            if (clazz != null) {  
                if (data.isObject()) {  
                    obj = MAPPER.readValue(data.traverse(), clazz);  
                } else if (data.isTextual()) {  
                    obj = MAPPER.readValue(data.asText(), clazz);  
                }  
            }  
            return build(jsonNode.get("status").intValue(), jsonNode.get("msg").asText(), obj);  
        } catch (Exception e) {  
            return null;  
        }  
    }  
  
    /**  
     * 将json串转化为TaotaoResult对象  
     *   
     * @param json  
     * @return  
     */  
    public static TaotaoResult format(String json) {  
        try {  
            return MAPPER.readValue(json, TaotaoResult.class);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        return null;  
    }  
  
    /**  
     * Object是集合转化  
     *   
     * @param jsonData json数据  
     * @param clazz 集合中的类型  
     * @return  
     */  
    public static TaotaoResult formatToList(String jsonData, Class<?> clazz) {  
        try {  
            JsonNode jsonNode = MAPPER.readTree(jsonData);  
            JsonNode data = jsonNode.get("data");  
            Object obj = null;  
            if (data.isArray() && data.size() > 0) {  
                obj = MAPPER.readValue(data.traverse(),  
                        MAPPER.getTypeFactory().constructCollectionType(List.class, clazz));  
            }  
            return build(jsonNode.get("status").intValue(), jsonNode.get("msg").asText(), obj);  
        } catch (Exception e) {  
            return null;  
        }  
    }  
  
}  